﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Helpers;
using TumbaloSoft.Models;
using System.Collections;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;
using System.IO;


namespace TumbaloSoft.Controllers
{
    public class EdificiosController : TumbaloController//<-- se cambio por TumbaloController
        /*TumbaloController ejecuta por defecto antes de todos los metodos las acciones de login y permisos*/
    {
        private static Object lockObject = new Object();
        //
        // GET: /Edificios/

        public ActionResult Index(BusquedaEdificio edificioBuscar)
        {
            //linea de login y permisos
            if (defaultAction != null) return defaultAction;
            //fin
            if (ViewBag.permiso != 1)
            {
                int numActivos = 0;
                try//dentro del try va todo lo que tenga que ver con los helpers que es lo que puede producir la exception
                {
                    ViewBag.lista = HelperDistrito.selectAll();
                    numActivos = HelperEdificio.selectCountActivos();
                    ViewBag.ListaEdificios = HelperEdificio.buscar(edificioBuscar);
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al obtener lista de edificios ", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
                ViewBag.prevPage = edificioBuscar.prPage - 1;
                ViewBag.nextPage = edificioBuscar.prPage + 1;
                ViewBag.numPages = numActivos / edificioBuscar.prPageSize;
                if ((numActivos % edificioBuscar.prPageSize) > 0) ViewBag.numPages++;
            }
            else
            {
                try
                {
                    ViewBag.lista = HelperDistrito.selectAll();
                    ViewBag.ListaEdificios = new List<Edificio>();
                    List<int> lis = HelperPropietario.selectListaEdificios(AccountController.getIdPersona(HttpContext));
                    foreach (int idEdif in lis)
                    {
                        ViewBag.ListaEdificios.Add(HelperEdificio.selectById(idEdif));
                    }
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al obtener lista de edificios ", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
            }
            
            return View(edificioBuscar);
        }

        public ActionResult Registrar()
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.lista = HelperDistrito.selectAll();
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al Obtener lista de distritos ", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View();
        }

        [HttpPost]
        public ActionResult Registrar(Edificio edif)
        {
            if (defaultAction != null) return defaultAction;
            //al no recibir el codigo en el post hay que eliminar el error ya que se calcula automaticamente
            ModelState.Remove("prIdEdificio");
            try { ViewBag.lista = HelperDistrito.selectAll(); }
            catch { return View("~/Views/Shared/Error.cshtml"); }

            var image = WebImage.GetImageFromRequest();

            if (ModelState.IsValid)
            {
                try
                {
                    if (image != null)
                    {
                        var extension = Path.GetExtension(image.FileName);
				    image.Resize(190,98);
				    
                        var filename = edif.prIdEdificio+ extension;
                        var path = Path.Combine(Server.MapPath("../Imagenes/Logos/"), filename);
                        image.Save(path);
                        edif.prLogo = Url.Content(Path.Combine("../Imagenes/Logos/", filename));
                    }
                    lock (lockObject)
                    {
                        edif.prIdEdificio = HelperEdificio.selectMaxCodigo() + 1;
                        HelperEdificio.insert(edif);
                    }
                }
                catch(Exception ex) 
                {
                    Logger.Current.Error("Error al insertar un edificio", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
                ViewBag.mensaje = "Se registro correctamente el edificio con ID= "+edif.prIdEdificio;
                ViewBag.returnURL = "/Edificios/modificar?id="+edif.prIdEdificio;
                return View("~/Views/Shared/Exito.cshtml");
            }
            else return View(edif);
        }

        public ActionResult Resultado(BusquedaEdificio edificioBuscar)
        {
            IList listaDistritos =
            ViewBag.lista = HelperDistrito.selectAll();
            ViewBag.ListaEdificios = HelperEdificio.buscar(edificioBuscar);
            return View(edificioBuscar);
        }

        public ActionResult Buscar()
        {
            IList listaDistritos = HelperDistrito.selectAll();
            ViewBag.lista = listaDistritos;
            return View();
        }

        public ActionResult Modificar(int? id)
        {
            if (defaultAction != null) return defaultAction;
		  if (!id.HasValue)
		  {
			  //return HttpNotFound("Esta pagina no existe");//se llamo sin parametro deberia devolver error
			  int IdPersona=AccountController.getIdPersona(HttpContext);
			  AdministradorEdificios administrador = HelperAdministrador.selectByIdPersona(IdPersona);
			  id = HelperAdministrador.buscaEdificioAdministrado(administrador.prIdAdministrador);
		  }
            Edificio edificio;
            try
            {
                edificio = HelperEdificio.selectById(id.Value);
                if (edificio == null) return HttpNotFound("No existe el edificio con el codigo " + id.Value);//si el edificio no se encontro//tambien deberia devolver error
                ViewBag.lista = HelperDistrito.selectAll();
                IList listaAreasComunes = HelperAreaComun.selectByIdEdificio(edificio.prIdEdificio);
                edificio.prListaAreasComunes = new List<AreaComun>(listaAreasComunes.Cast<AreaComun>());
                IList listaDepartamentos = HelperDepartamento.selectByIdEdificio(edificio.prIdEdificio);
                edificio.prListaDepartamentos = new List<Departamento>(listaDepartamentos.Cast<Departamento>());
                edificio.prNroDepartamentos = edificio.prListaDepartamentos.Count;
                ViewBag.listaMiembrosJuntas = HelperJuntaDePropietarios.selectActivosByIdEdificio(id.Value);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al intentar cargar el edificio con id"+id, ex);
                return View("~/Views/Shared/Error.cshtml");
            }

            return View(edificio);

        }

        [HttpPost]
        public ActionResult Modificar(Edificio edif, int prIdDistrito)
        {
            if (defaultAction != null) return defaultAction;
            var image = WebImage.GetImageFromRequest();
            edif.prDistrito = new Distrito();
            edif.prDistrito.prIdDistrito = prIdDistrito;
            if (ModelState.IsValid)
            {
                try
                {
                    ViewBag.lista = HelperDistrito.selectAll();
                    IList listaAreasComunes = HelperAreaComun.selectByIdEdificio(edif.prIdEdificio);
                    edif.prListaAreasComunes = new List<AreaComun>(listaAreasComunes.Cast<AreaComun>());
                    IList listaDepartamentos = HelperDepartamento.selectByIdEdificio(edif.prIdEdificio);
                    edif.prListaDepartamentos = new List<Departamento>(listaDepartamentos.Cast<Departamento>());
                    if (image != null)
                    {
				        image.Resize(190, 98);
                        var extension = Path.GetExtension(image.FileName);
                        var filename = edif.prIdEdificio + extension;
                        var path = Path.Combine(Server.MapPath("../Imagenes/Logos/"), filename);
                        image.Save(path);
                        edif.prLogo = Url.Content(Path.Combine("../Imagenes/Logos/", filename));
                    }
                    HelperEdificio.update(edif);
                }
                catch(Exception ex)
                {
                    Logger.Current.Error("Error al modificar edificio", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }

                ViewBag.mensaje = "Se modifico correctamente el edificio con ID= " + edif.prIdEdificio;
                ViewBag.returnURL = "/Edificios/modificar?id=" + edif.prIdEdificio;
                return View("~/Views/Shared/Exito.cshtml");
            }
            try
            {
                ViewBag.lista = HelperDistrito.selectAll();
                IList listaAreasComunes = HelperAreaComun.selectByIdEdificio(edif.prIdEdificio);
                edif.prListaAreasComunes = new List<AreaComun>(listaAreasComunes.Cast<AreaComun>());
                IList listaDepartamentos = HelperDepartamento.selectByIdEdificio(edif.prIdEdificio);
                edif.prListaDepartamentos = new List<Departamento>(listaDepartamentos.Cast<Departamento>());
                edif.prNroDepartamentos = edif.prListaDepartamentos.Count;
                ViewBag.listaMiembrosJuntas = HelperJuntaDePropietarios.selectActivosByIdEdificio(edif.prIdEdificio);
                return View(edif);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al cargar un edificio", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        public ActionResult Eliminar(int? id)
        {
            if (defaultAction != null) return defaultAction;

            if (!id.HasValue) return HttpNotFound("Esta pagina no existe");//se llamo sin parametro deberia devolver error
            Edificio edificio;
            try
            {
                edificio = HelperEdificio.selectById(id.Value);
                if (edificio == null) return HttpNotFound("No existe el edificio con el codigo " + id.Value);//si el edificio no se encontro//tambien deberia devolver error
                IList listaAreasComunes = HelperAreaComun.selectByIdEdificio(edificio.prIdEdificio);
                edificio.prListaAreasComunes = new List<AreaComun>(listaAreasComunes.Cast<AreaComun>());
                IList listaDepartamentos = HelperDepartamento.selectByIdEdificio(edificio.prIdEdificio);
                edificio.prListaDepartamentos = new List<Departamento>(listaDepartamentos.Cast<Departamento>());
                ViewBag.lista = HelperDistrito.selectAll();
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al cargar un edificio", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View(edificio);
        }
        [HttpPost]
        public ActionResult Eliminar (Edificio edif, int prIdDistrito)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.lista = HelperDistrito.selectAll();
                IList listaAreasComunes = HelperAreaComun.selectByIdEdificio(edif.prIdEdificio);
                edif.prListaAreasComunes = new List<AreaComun>(listaAreasComunes.Cast<AreaComun>());
                IList listaDepartamentos = HelperDepartamento.selectByIdEdificio(edif.prIdEdificio);
                edif.prListaDepartamentos = new List<Departamento>(listaDepartamentos.Cast<Departamento>());
                edif.prDistrito = new Distrito();
                edif.prDistrito.prIdDistrito = prIdDistrito;
                HelperEdificio.delete(edif);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al eliminar un edificio", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            ViewBag.mensaje = "Se elimino correctamente el edificio con ID= " + edif.prIdEdificio;
            ViewBag.returnURL = "/Edificios";
            return View("~/Views/Shared/Exito.cshtml");
        }


    }
}
